package compiler.syntax.nonTerminal;

import java.util.Vector;

public class T_TablaTipos {

	private Vector tabla;
	
	public T_TablaTipos() {
		
		tabla 		= new Vector();
		T_Tipo tipo = new T_Tipo();
		
		tipo.setCod			(0);
		tipo.setNombre		("Integer");
		tipo.setDimension	(1);
		tipo.setAmbito		(0);
		addTipo(tipo);
		
		tipo.setCod			(0);
		tipo.setNombre		("Boolean");
		tipo.setDimension	(1);
		tipo.setAmbito		(0);
		addTipo(tipo);		
		
	}

	public void addTipo(T_Tipo tipo) {
		
		tabla.addElement(tipo);
		
	}
	
	/*
	 *  Como los ambitos iran incrementandose buscaremos desde el final al principio
	 *  hasta que el ambito sea menor que el que buscamos
	 */
	public boolean existeTipoEnAmbito (String nombreTipo, int ambito){
		
		T_Tipo tipo;
		boolean retorno = false;
		
		for (int i=tabla.size()-1; i>=0; i--){
			tipo = getFinal();
			if (tipo.getAmbito() > ambito){
				break;
			}else{
				if(tipo.getNombre().equals(nombreTipo)){
					retorno = true;
					break;
				}
			}
		}
		return retorno;
	}
	
	
	/*
	 * Devuelve el ultimo elemento de la tabla
	 */
	public T_Tipo getFinal(){
		return (T_Tipo)tabla.lastElement();
	}
	
	/*
	 * Devuelve el tipo con un numero de orden concreto.
	 * El mismo que su codigo
	 */
	public T_Tipo getTipo(int i){
		return (T_Tipo)tabla.elementAt(i);
	}
	
	/*
	 * Elimina el ultimo elemento de la tabla
	 */
	public void delFinal(){
		tabla.removeElementAt(tabla.size()-1);
	}
	
	/*
	 * Pone un tipo en una posicion de la tabla
	 */
	public void setTipo(T_Tipo tipo, int pos){
		tabla.setElementAt(tipo, pos);
	}
	
	/*
	 * Devuelve el tipo correspondiente a un nombre
	 */
	public T_Tipo getTipo(String nombre){
		T_Tipo retorno = null;
		T_Tipo tipo;
		
		for (int i=tabla.size()-1 ; i >=0; i--){
			tipo = getTipo(i);
			if(tipo.getNombre().equals(nombre)){
				retorno = tipo;
				break;
			}
		}
		return retorno;
	}
	
	/*
	 * Devuelve el codigo de un tipo por su nombre
	 */
	public int getCodigo(String nombre){
		T_Tipo tipo = getTipo(nombre);
		return tipo.getCod();
	}
	
	/*
	 * Elimina todos los tipos del ultimo ambito
	 */
	public void delUltimoAmbito(){
		
		int tamano = tabla.size();
		T_Tipo tipo = getFinal();
		int ambitoActual = tipo.getAmbito();
		
		for (int i=0;i<tamano;i++){
			tipo = getFinal();
			if (tipo.getAmbito() >= ambitoActual){
				delFinal();
			}else{
				break;
			}
		}
	}
}
